package com.mycat.ftp;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * Java自带的API对FTP的操作。 Created by yulong.pan on 2015/6/10.
 *
 * @author yulong.pan
 * @since 1.0
 */
public class FtpUtils {
	private static final Logger LOG = LoggerFactory.getLogger(FtpUtils.class);

	/**
	 * 不让实例化
	 */
	private FtpUtils() {
	}

	/**
	 * 向FTP服务器上传文件。
	 *
	 * @param url
	 *            FTP服务器hostname
	 * @param port
	 *            FTP服务器端口
	 * @param username
	 *            FTP登录账号
	 * @param password
	 *            FTP登录密码
	 * @param path
	 *            FTP服务器保存目录
	 * @param filename
	 *            上传到FTP服务器上的文件名
	 * @param input
	 *            输入流
	 * @return 成功返回true，否则返回false
	 */
	public static boolean uploadFile(String url, int port, String username, String password, String path,
			String filename, InputStream input) {
		boolean isSuccess = false;
		FTPClient ftp = new FTPClient();
		try {
			int reply;
			ftp.connect(url, port);// 连接FTP服务器
			// 如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftp.login(username, password);// 登录
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return false;
			}
			ftp.setBufferSize(2048);
			ftp.setControlEncoding("GBK");
			ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
			ftp.enterLocalPassiveMode();
			ftp.changeWorkingDirectory(path);
			ftp.storeFile(filename, input);
			isSuccess = true;
		} catch (IOException e) {
			LOG.error("ftp上传文件失败：" + e.getMessage());
		} finally {

			if (input != null) {
				try {
					input.close();
				} catch (IOException e) {
					LOG.error("fileInputStream.close 失败：" + e.getMessage());
				}
			}
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
					ftp.logout();
				} catch (IOException ioe) {
					LOG.error("ftp.disconnect 失败：" + ioe.getMessage());
				}
			}
		}
		return isSuccess;
	}

	/**
	 * 登录FTP服务器
	 *
	 * @param hostName
	 *            ftp服务器主机名
	 * @param port
	 *            端口
	 * @param username
	 *            ftp服务器账号
	 * @param password
	 *            ftp服务器密码
	 * @return FTPClient
	 */
	public static FTPClient loginFtp(String hostName, int port, String username, String password) {
		FTPClient ftpClient = new FTPClient();
		int reply;
		try {
			// 1.连接服务器
			ftpClient.connect(hostName, port);
			reply = ftpClient.getReplyCode();
			if (LOG.isDebugEnabled()) {
				LOG.debug("replay:{}", reply);
			}
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftpClient.disconnect();
				if (LOG.isDebugEnabled()) {
					LOG.debug("FTP 服务器拒绝连接！");
				}
				throw new IOException("FTP 服务器拒绝连接！");
			}

			// 2.登录服务器 如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftpClient.login(username, password);
			reply = ftpClient.getReplyCode();
			if (LOG.isDebugEnabled()) {
				LOG.debug("replay:{}", reply);
			}
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftpClient.disconnect();
				if (LOG.isDebugEnabled()) {
					LOG.debug("无效的用户名或密码！");
				}
				throw new IOException("无效的用户名或密码！");
			}
		} catch (IOException ioe) {
			if (LOG.isErrorEnabled()) {
				LOG.error("连接远程服务失败:{}", ioe.getMessage());
			}
		}
		return ftpClient;
	}

	/**
	 * 向FTP服务器删除文件。
	 *
	 * @param url
	 *            FTP服务器hostname
	 * @param port
	 *            FTP服务器端口
	 * @param username
	 *            FTP登录账号
	 * @param password
	 *            FTP登录密码
	 * @param path
	 *            FTP服务器保存目录
	 * @param filename
	 *            FTP服务器上需删除的文件名
	 * @return 成功返回true，否则返回false
	 */
	public static boolean deleteFileFtp(String url, int port, String username, String password, String path,
			String filename) {
		boolean isSuccess = false;
		FTPClient ftp = new FTPClient();
		try {
			int reply;
			ftp.connect(url, port);// 连接FTP服务器
			// 如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftp.login(username, password);// 登录
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return false;
			}
			ftp.changeWorkingDirectory(path);
			ftp.deleteFile(filename);
			isSuccess = true;
		} catch (IOException e) {
			LOG.error("ftp删除文件失败：" + e.getMessage());
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
					ftp.logout();
				} catch (IOException ioe) {
					LOG.error("ftp.disconnect 失败：" + ioe.getMessage());
				}
			}
		}
		return isSuccess;
	}

	public static void main(String[] args) {
		try {
			File file = new File("E:\\扩展\\文件服务器\\2-10-使用Apache搭建web网站.doc");
			InputStream input = new FileInputStream(file);
			boolean falg = uploadFile("192.168.1.188", 21, "other", "123456", "/var/www/html/images",
					"使用Apache搭建web网站.doc", input);
			System.out.println(falg);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}